import java.util.HashMap;
import java.util.Map;

public class Modelador {
	
	private String nomeModelador, especialidade;
	private double reputacao;
	private int qualidade;
	private Map<String, Double> mapaKV;
	private Map<String, Integer> mapaVersoesPublicadas;
	
	public Modelador(){		
		mapaVersoesPublicadas = new HashMap<String, Integer>();
	}
	
	public String getNomeModelador() {
		return nomeModelador;
	}
	
	public void setNomeModelador(String nomeModelador) {
		this.nomeModelador = nomeModelador;
	}
	
	public int getQualidade() {
		return this.qualidade;
	}
	
	public void setQualidade(int qualidade){
		this.qualidade = qualidade;
	}
	
	public double getReputacao() {
		return reputacao;
	}
	
	public void setReputacao(double reputacao2) {
		this.reputacao = reputacao2;
	}

	public int getVersoesPublicadas(String assunto) {
		int versoesPublicadas;
		
		if (mapaVersoesPublicadas.containsKey(assunto)){
			versoesPublicadas = mapaVersoesPublicadas.get(assunto);
		}
		else{
			versoesPublicadas = 0;
		}
		
		return versoesPublicadas;
	}

	public void setVersoesPublicadas(int versoesPublicadas, String assunto) {
		mapaVersoesPublicadas.put(assunto, versoesPublicadas);		
	}
	
	public int novaVersao(String assunto){
		int versoesPublicadas;
		
		if (mapaVersoesPublicadas.containsKey(assunto)){
			versoesPublicadas = mapaVersoesPublicadas.get(assunto);
			versoesPublicadas++;
		}
		else{
			versoesPublicadas = 1;
		}
		
		mapaVersoesPublicadas.put(assunto, versoesPublicadas);
		return versoesPublicadas;
	}
	
	public void incrementaKV(String assunto, double valor){
		double tmp;
		
		if (this.mapaKV == null){
			this.mapaKV = new HashMap<String, Double>();
		}
		
		tmp = valor; 
		
		if(this.mapaKV.containsKey(assunto)){
			tmp += this.mapaKV.get(assunto);			
		}
		
		this.mapaKV.put(assunto, tmp);
	}
	
	public void setEspecialidade(String assunto) {
		this.especialidade = assunto;
	}
	
	public String getEspecialidade(){
		return this.especialidade;
	}

	public double getFatorConhecimento(String assunto) {
		double numerador, fatorCorrecao, moduloKV, moduloAssunto, denominador;
		
		fatorCorrecao = 0;
		
		if (this.mapaKV.containsKey(assunto)){
			numerador = this.mapaKV.get(assunto);
			
			moduloKV = 0;
			for(String str:this.mapaKV.keySet()){
				moduloKV += Math.pow(this.mapaKV.get(str), 2);
			}
			
			moduloKV = Math.pow(moduloKV, 0.5);
			moduloAssunto = Math.pow(1, 0.5);			
			denominador = moduloKV * moduloAssunto;
			
			fatorCorrecao = numerador / denominador;
		}
		
		return fatorCorrecao;
	}
}
